#ifndef __BSP_USART_H
#define __BSP_USART_H

#include "stm32f4xx.h"
#include "stdio.h"

#define Serial                      USART1

// USART
#define USART_GPIO                  GPIOA
#define USART_TX_Pin                GPIO_Pin_9
#define USART_RX_Pin               GPIO_Pin_10

// IT模式
#define Serial_IRQ                    USART1_IRQn
#define Serial_IRQHANDLER             USART1_IRQHandler

// 数据包大小
#define PacketHex_Size                   4   // Hex模式固定数据包大小
#define PacketASCII_MAX_Size             20  // ASCII模式数据包大小的最大值

/* 串口状态类型 */
typedef enum {
    USART_StateFree = 0,   // 空闲状态
    USART_StateWork = 1,   // 工作状态 -- 收到0xFF时进入工作状态
    USART_StateEnd = 2     // 结束状态 -- 收到0xFE时进入结束状态
} SerialState_t;

/* 串口接收的模式 */
typedef enum {
    USART_ModeHex   = 0,  // Hex模式
    USART_ModeASCII = 1,  // ASCII模式
} SerialMode_t;

/* 串口状态机类型 */
typedef struct __USARTState {
    uint8_t Serial_TxPacket[PacketASCII_MAX_Size];
    uint8_t Serial_RxPacket[PacketASCII_MAX_Size];
    SerialState_t RxState;                 // 串口接收的状态
    SerialMode_t  RxMode;                  // 串口接收的模式
    uint8_t Rx_EndFlag;                    // 串口接收完成的标志, SET or RESET
    uint8_t pos;                           // 当前即将发送/接收的位置
} USARTStateMachine_t;

/* 串口状态机 */
extern USARTStateMachine_t USARTStater;
extern uint8_t Serial_RxBuff;

/* 初始化串口 */
void USART_Config(uint32_t Baud);

/* 发送数据到串口 */
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNum(uint32_t Num, uint8_t Length);
void Serial_Printf(char *format, ...);

/* 检测串口接收完成 */
uint8_t Serial_GetRxEnd(USARTStateMachine_t *pUSARTStater);

/* printf重定向 */
int fputc(int ch, FILE *f);
int fgetc(FILE *f);

/* 串口调pid有关参数 */
uint8_t Serial_GetPidFlag();
void Serial_ClearPidFlag();
uint8_t Serial_PidHandle(char* str, float *pData);
void Serial_UpdateParam();

#endif /* __BSP_USART_H */